package 多线程.CompletableFuture异步编排;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * whenComplete可以处理正常和异常的计算结果；exceptionally 处理异常情况;
 * whenComplete：执行当前任务的线程继续来执行whenComplete的任务；
 * - whenCompleteAsync：将 whenCompleteAsync需要执行的任务交给线程池来进行执行；
 * 不带Async执行任务的线程和执行完任务去执行回调方法whenComplete使用的线程是相同的；
 * 带Async执行回调方法会去线程池中寻找空闲的线程执行（如果使用相同的线程池，也可能是相同的线程执行）。
 *
 * 和exceptionally一样，可以对任务执行完毕进行后续处理，不同的是该方法在任务正常或异常都可以对其进行后续处理。
 */
public class ThreadTest04 {
    // 自定义线程池
    public static final ExecutorService executorService = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
            System.out.println("线程开始执行...");
            int i = 100 / 20;
            System.out.println("运行结果:" + i);
            return i;
        }, executorService).whenCompleteAsync((result, exception) -> {
            System.out.println("线程执行完毕, 返回结果:" + result +  "异常:" + exception);
            // 线程执行完毕, 返回结果:5异常:null
        }).handle((result, throwable) -> {
            Integer rs = null;
            if (result != null) {
                rs = result * 2;
            } else if (throwable != null) {
                rs = 0;
            }
            return rs;
        });
        Integer i = future.get();
        System.out.println("获取到返回值:" + i);	// 获取到返回值:10
    }


}
